package algebra;

import java.util.Scanner;

/**
 * double我这是在测试，我看看可不可以
 * 
 * @author BT С��IT
 *
 */
public class DoubleMatrix {
	public int column;
	public int row;
	public double[][] array;
	Scanner in = new Scanner(System.in);

	/**
	 * ��һ�������double���͵ľ���Ĺ��캯��
	 * 
	 * ֻ��һ������ޚ���캯��ָ���˳��ȺͿ��
	 * 
	 * @param rowAndColumn
	 *            ������к��еĸ���
	 */
	public DoubleMatrix(int rowAndColumn) {
		this.row = rowAndColumn;
		this.column = rowAndColumn;
		array = new double[row][column];
	}

	/**
	 * �������������double���͵Ĺ��캯��
	 * 
	 * ������������Ĺ��캯��ָ�����к��еĸ���
	 * 
	 * @param row
	 *            ָ���������
	 * @param column
	 *            ָ���������
	 */
	public DoubleMatrix(int row, int column) {
		this.row = row;
		this.column = column;
		array = new double[row][column];
	}

	/**
	 * �Ծ���ĸ��и���������ֵ
	 */
	public void in() {
		/*
		 * ��ʾ�û������к����е���ֵ
		 */
		System.out.println("������и����е�double���͵�����");
		for (int i = 0; i < row; i++) {
			for (int j = 0; j < column; j++) {
				array[i][j] = in.nextDouble();
			}
		}
	}

	/**
	 * toString()����
	 * 
	 * ���ص�ǰ����ľ�����ʾ
	 */
	public String toString() {
		String s = "";
		for (int i = 0; i < row; i++) {
			for (int j = 0; j < column; j++) {
				s += array[i][j] + "\t";
			}
			s += "\n";
		}
		return s;
	}

	public String toString(int n) {
		String s = "";
		for (int i = 0; i < row; i++) {
			for (int j = 0; j < column; j++) {
				s += randDigit(array[i][j], n) + "\t";
			}
			s += "\n";
		}
		return s;
	}

	/**
	 * ʵ�ֱ�����Чλ��Ĳ���
	 * 
	 * @param num
	 *            ��ȡֵ��С��
	 * @param numLong
	 *            ����λ��
	 * @return ����ȡֵ���С��
	 */
	public static double randDigit(double num, int numLong) {
		double tempDouble = num * Math.pow(10, numLong);
		int tempInt = (int) Math.abs(tempDouble);
		double finalDouble = tempInt / Math.pow(10, numLong);
		return finalDouble;
	}

	/**
	 * ����Ļ�ӷ�
	 * 
	 * ���Ҫ����,��������к��б��볤����ͬ
	 * 
	 * @param newArray
	 *            ������ӵ�����һ������
	 * @return ������������ӵĽ��
	 * @throws Exception
	 *             ������������к��в�һ�µ�����׳��쳣
	 */
	public DoubleMatrix add(DoubleMatrix newArray) throws Exception {
		DoubleMatrix totalArray = null;
		if (addAndSubCheck(newArray) == false) {
			throw new Exception("����ľ������,���в�һ��");// �׳����󳤶Ȳ�һ�µ��쳣
		} else {
			totalArray = new DoubleMatrix(this.row, this.column);
			for (int i = 0; i < this.row; i++) {
				for (int j = 0; j < this.column; j++) {
					totalArray.array[i][j] = this.array[i][j] + newArray.array[i][j];
				}
			}
			return totalArray;
		}
	}

	/**
	 * ʵ�־���Ļ����
	 * 
	 * @param newArray
	 *            ����������һ������
	 * @return ��������������Ľ��
	 * @throws Exception
	 *             �׳������󳤶Ȳ�һ�µ��쳣
	 */
	public DoubleMatrix sub(DoubleMatrix newArray) throws Exception {
		DoubleMatrix finalArray = null;
		if (addAndSubCheck(newArray) == false) {
			throw new Exception("����ľ������,���в�һ��");// �׳����󳤶Ȳ�һ�µ��쳣
		} else {
			finalArray = new DoubleMatrix(this.row, this.column);
			for (int i = 0; i < this.row; i++) {
				for (int j = 0; j < this.column; j++) {
					finalArray.array[i][j] = this.array[i][j] - newArray.array[i][j];
				}
			}
			return finalArray;
		}
	}

	/**
	 * �����������к����Ƿ����
	 * 
	 * @param newArray
	 *            ���Ƚϵ�����һ������
	 * @return ����������к��и������,�򷵻�true
	 * 
	 *         ����������к�����һ������ͬ,�򷵻�false
	 */
	public boolean addAndSubCheck(DoubleMatrix newArray) {
		if (this.row == newArray.row && this.column == newArray.column) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * ����ĳ˷�,
	 * 
	 * ��Ҫע��:��ǰ���������Ҫ������һ������������
	 * 
	 * ��ǰ���������Ҫ������һ������������
	 * 
	 * @param newArray
	 *            ����һ������
	 * @return ���ؾ���˷��Ľ��,���ض���ΪdoubleArray����
	 * @throws Exception
	 *             �׳������������Ӧ�Ĵ���
	 */
	public DoubleMatrix mult(DoubleMatrix newArray) throws Exception {
		DoubleMatrix finalArray = null;
		if (this.multCheck(newArray) != true) {
			throw new Exception("����ľ���˷����㣬���������ܽ��г˷�");
		} else {
			finalArray = new DoubleMatrix(this.row, newArray.column);
			for (int i = 0; i < finalArray.row; i++) {// �����к�
				for (int j = 0; j < finalArray.column; j++) {// �����к�
					for (int m = 0; m < this.column; m++) {
						finalArray.array[i][j] += this.array[i][m] * newArray.array[m][j];
					}
				}
			}
			return finalArray;
		}

	}

	/**
	 * ����˷��ľ��󻷾����
	 * 
	 * @param newArray
	 *            ���бȽϵ�����һ��doubleArray����
	 * @return ���ǰ��������������һ��������в����,�ͷ���false
	 * 
	 *         ���򷵻�true
	 */
	public boolean multCheck(DoubleMatrix newArray) {
		if (this.column == newArray.row && this.row == newArray.column) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * ����λ����
	 * 
	 * @param rowAndColumn
	 *            ��λ���������
	 * @return ����doubleArray���͵Ķ���
	 */
	public static DoubleMatrix ones(int rowAndColumn) {
		DoubleMatrix finalArray = null;
		finalArray = new DoubleMatrix(rowAndColumn);
		for (int i = 0; i < rowAndColumn; i++) {
			finalArray.array[i][i] = 1;
		}
		return finalArray;
	}

	/**
	 * ����������
	 * 
	 * @param rowAndColumn
	 *            ������к���
	 * @return ����rowAndColumn�׵�������
	 */
	public static DoubleMatrix rand(int rowAndColumn) {
		DoubleMatrix finalArray = null;
		finalArray = new DoubleMatrix(rowAndColumn);
		for (int i = 0; i < rowAndColumn; i++) {
			for (int j = 0; j < rowAndColumn; j++) {
				finalArray.array[i][j] = Math.random() * 10;
			}
		}
		return finalArray;
	}

	/**
	 * ����������,ָ��row��Column��������
	 * 
	 * @param row
	 *            ����
	 * @param column
	 *            ����
	 * @return ����row��Column�е�������
	 */
	public static DoubleMatrix rand(int row, int column) {
		DoubleMatrix finalArray = null;
		finalArray = new DoubleMatrix(row, column);
		for (int i = 0; i < row; i++) {
			for (int j = 0; j < column; j++) {
				finalArray.array[i][j] = Math.random() * 10;
			}
		}
		return finalArray;
	}

	/**
	 * ����ÿ����Ϊָ����С��Χ��������
	 * 
	 * @param rowAndColumn
	 *            ������к���
	 * @param randNumber
	 *            ָ��������ľ����������Ĵ�С
	 * @return ����rowAndColumn�׵�������
	 */
	public static DoubleMatrix rand(int rowAndColumn, float randNumber) {
		DoubleMatrix finalArray = null;
		finalArray = new DoubleMatrix(rowAndColumn);
		for (int i = 0; i < rowAndColumn; i++) {
			for (int j = 0; j < rowAndColumn; j++) {
				finalArray.array[i][j] = Math.random() * randNumber;
			}
		}
		return finalArray;
	}

	/**
	 * ����������,ָ��row��Column��������,
	 * 
	 * @param row
	 *            ����
	 * @param column
	 *            ����
	 * @param randNumber
	 *            ָ������������е������Ĵ�С��Χ
	 * @return ����row��Column�е�������
	 */
	public static DoubleMatrix rand(int row, int column, float randNumber) {
		DoubleMatrix finalArray = null;
		finalArray = new DoubleMatrix(row, column);
		for (int i = 0; i < row; i++) {
			for (int j = 0; j < column; j++) {
				finalArray.array[i][j] = Math.random() * randNumber;
			}
		}
		return finalArray;
	}
	/**
	 * TestMethod
	 * 
	 * @param args
	 *            ϵͳ����
	 * @throws Exception
	 *             �׳����󳤶Ȳ�ƥ����쳣
	 */
	// public static void main(String[] args) throws Exception {
	// doubleArray da1 = doubleArray.rand(3, 3);
	// doubleArray da2 = doubleArray.rand(3, 3);
	// System.out.println(da1.mult(da2).toString());
	// }

	/**
	 * ���������
	 * 
	 * @return ���ص�ǰ����������
	 */
	public DoubleMatrix inverseMatrix() {

		DoubleMatrix finalArray = null;
		return finalArray;
	}
}
